package com.fanix5.javamvvm.widget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.os.Build;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.ColorInt;

import com.blankj.utilcode.util.ColorUtils;
import com.blankj.utilcode.util.ConvertUtils;
import com.fanix5.javamvvm.R;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;

public class DefineLoadMoreView extends LinearLayout implements SwipeRecyclerView.LoadMoreView, View.OnClickListener {

    private SwipeRecyclerView.LoadMoreListener mLoadMoreListener;
    private ProgressBar mProgressBar;
    private TextView mTvMessage;


    public void setmLoadMoreListener(SwipeRecyclerView.LoadMoreListener mLoadMoreListener){
        this.mLoadMoreListener = mLoadMoreListener;
    }


    public void setLoadViewColor(@ColorInt int color){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mProgressBar.setIndeterminateTintMode(PorterDuff.Mode.SRC_ATOP);
            mProgressBar.setIndeterminateTintList(ColorStateList.valueOf(color));
        }
    }



    public DefineLoadMoreView(Context context) {
        super(context);
        intView(context);
    }

    private void intView(Context context) {
        this.setLayoutParams(new LayoutParams(-1,-2));
        this.setGravity(Gravity.CENTER);
        this.setVisibility(View.GONE);
        int minHeight = ConvertUtils.dp2px(36f);
        this.setMinimumHeight(minHeight);
        View.inflate(context, R.layout.layout_fotter_loadmore,this);
        mProgressBar = findViewById(R.id.loading_view);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mProgressBar.setIndeterminateTintMode(PorterDuff.Mode.SRC_ATOP);
            mProgressBar.setIndeterminateTintList(ColorStateList.valueOf(0xff000000));
        }
        mTvMessage = findViewById(R.id.tv_message);
        setOnClickListener(this);
    }



    /**
     * 非自动加载更多时mLoadMoreListener才不为空。
     */
    @Override
    public void onClick(View v) {
        //为什么加后面那个判断，因为Wandroid第0页能够请求完所有数据的情况下， 再去请求第1页 也能取到值，
        // 所以这里要判断没有更多数据的时候禁止在响应点击事件了,同时在加载中时也不能触发加载更多的监听
        if (mLoadMoreListener != null) mLoadMoreListener.onLoadMore();
    }


    /**
     * 马上开始回调加载更多了，这里应该显示进度条。
     */
    @Override
    public void onLoading() {
        this.setVisibility(View.VISIBLE);
        mProgressBar.setVisibility(View.VISIBLE);
        mTvMessage.setVisibility(View.VISIBLE);
        mTvMessage.setText("正在努力加载,请稍后");
    }

    /**
     * 加载更多完成了。
     *
     * @param dataEmpty 是否请求到空数据。
     * @param hasMore 是否还有更多数据等待请求。
     */
    @Override
    public void onLoadFinish(boolean dataEmpty, boolean hasMore) {
        if(!hasMore){
            this.setVisibility(View.VISIBLE);
            if(dataEmpty){
                mProgressBar.setVisibility(View.GONE);
                mTvMessage.setVisibility(View.VISIBLE);
                mTvMessage.setText("暂时没有数据");
            }else {
                mProgressBar.setVisibility(View.GONE);
                mTvMessage.setVisibility(View.VISIBLE);
                mTvMessage.setText("没有更多数据@");
            }
        }else {
            this.setVisibility(View.INVISIBLE);
        }
    }



    /**
     * 调用了setAutoLoadMore(false)后，在需要加载更多的时候，这个方法会被调用，并传入加载更多的listener。
     */
    @Override
    public void onWaitToLoadMore(SwipeRecyclerView.LoadMoreListener loadMoreListener) {
        this.mLoadMoreListener = loadMoreListener;
        this.setVisibility(View.VISIBLE);
        mProgressBar.setVisibility(View.GONE);
        mTvMessage.setVisibility(View.VISIBLE);
        mTvMessage.setText("点我加载更多");
    }



    /**
     * 加载出错啦，下面的错误码和错误信息二选一。
     *
     * @param errorCode 错误码。
     * @param errorMessage 错误信息。
     */
    @Override
    public void onLoadError(int errorCode, String errorMessage) {
        this.setVisibility(View.VISIBLE);
        mProgressBar.setVisibility(View.GONE);
        mTvMessage.setVisibility(View.VISIBLE);
        // 这里要不直接设置错误信息，要不根据errorCode动态设置错误数据。
        mTvMessage.setText(errorMessage);
        Log.i("hgj", "加载失败啦");
    }
}
